/** 
* @file        demo_zos_mutex.c
* @ingroup     mutex demo
* @brief       演示mutex应用，通过打印A-Z字母演示
*/
/**
 * @defgroup task demo
 */
#include "zos_config.h"
#ifdef BOARD_USING_MUTEX_DEMO

#include "zos.h"

//定义demo 任务句柄
zos_task_t task_show_handle = ZOS_NULL;
zos_task_t task_change_handle = ZOS_NULL;

//定义demo 互斥量句柄
zos_mutex_t demo_mutex = ZOS_NULL;

//定义全局变量，公共资源 
char value = 'A';


//任务1执行函数，任务1获取到互斥量后，打印全部变量，并且控制LED，然后释放互斥量 
void task_show_fun(void *parameter)
{
    zos_pin_mode(PIN_5,PIN_MODE_OUTPUT);
    while(1)
    {
        

        //获取互斥量
        zos_mutex_lock(demo_mutex,ZOS_WAITING_FOREVER);

        //打印全部变量
        zos_printf("value:%c\r\n",value);

        //控制LED
        zos_pin_write(PIN_5,PIN_HIGH);
        zos_task_delay(1000);
        zos_pin_write(PIN_5,PIN_LOW);
        zos_task_delay(1000);

        //释放互斥量
        zos_mutex_unlock(demo_mutex);
    }
	//结束任务前需要先把任务句柄赋值为ZOS_NULL，然后调用zos_task_exit()函数结束任务本身
	task_show_handle = ZOS_NULL;
	zos_task_exit();
}


//任务2执行函数，任务2获取到互斥量后，修改全部变量，然后释放互斥量 
void task_change_fun(void *parameter)
{
    while(1)
    {
        //获取互斥量
        zos_mutex_lock(demo_mutex,ZOS_WAITING_FOREVER);

        //修改全部变量
        if(value < 'Z')
		{
			value++;
		}
		else
		{
			value = 'A';
		}

        //释放互斥量 
        zos_mutex_unlock(demo_mutex);

        //延时1ms,让出任务控制权
        zos_task_delay(1);
    }
	task_change_handle = ZOS_NULL;
	zos_task_exit();
}

//任务初始化
int demo_mutex_init(int argc, char *argv[])
{
    //创建互斥量
    demo_mutex = zos_mutex_create(mutex_flag_PrioInherit);

    //创建用户任务，注意任务的Priority 优先级不能全部设置为同一个等级，自己后期创建的任务需要根据任务的情况适当的降低或者提高优先级。
	
    //创建任务1
	task_show_handle = zos_task_create("show_task1",task_show_fun,ZOS_NULL,1024,task_Priority_Normal1);

    //由于任务2优先级比任务1高，为了避免抢占任务控制权，我们延时10ms在创建任务2
    zos_task_delay(10);
	//创建任务2
	task_change_handle = zos_task_create("change_task2",task_change_fun,ZOS_NULL,1024,task_Priority_Normal2);
    return	ZOS_EOK;

}

#include "shell.h"

SHELL_EXPORT_CMD(demo_mutex,demo_mutex_init, mutex demo);

#endif





